package com.itheima.restkeeper.face;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.restkeeper.AffixFace;
import com.itheima.restkeeper.BrandFace;
import com.itheima.restkeeper.enums.BrandEnum;
import com.itheima.restkeeper.exception.ProjectException;
import com.itheima.restkeeper.pojo.Brand;
import com.itheima.restkeeper.req.AffixVo;
import com.itheima.restkeeper.req.BrandVo;
import com.itheima.restkeeper.service.IBrandService;
import com.itheima.restkeeper.utils.BeanConv;
import com.itheima.restkeeper.utils.EmptyUtil;
import com.itheima.restkeeper.utils.ExceptionsUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.dubbo.config.annotation.DubboService;
import org.apache.dubbo.config.annotation.Method;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;

/**
 * @ClassName BrandFaceImpl.java
 * @Description 品牌dubbo接口定义实现
 */
@DubboService(version = "${dubbo.application.version}",timeout = 5000,
    methods ={
        @Method(name = "findBrandVoPage",retries = 2),
        @Method(name = "createBrand",retries = 0),
        @Method(name = "updateBrand",retries = 0),
        @Method(name = "deleteBrand",retries = 0)
    })
@Slf4j
public class BrandFaceImpl implements BrandFace {

    @Autowired
    IBrandService brandService;

    @DubboReference(version = "${dubbo.application.version}",check = false)
    AffixFace affixFace;    // 附件资源  远程接口



    @Override
    public Page<BrandVo> findBrandVoPage(BrandVo brandVo,
                                         int pageNum,
                                         int pageSize) throws ProjectException{
        try {
            //查询Page<Brand>图片分页
            Page<Brand> brandPage = brandService.findBrandVoPage(brandVo, pageNum, pageSize);
            //转化Page<Brand>为Page<BrandVo>
            Page<BrandVo> brandVoPage = new Page<>();
            BeanConv.toBean(brandPage,brandVoPage);
            //转换List<Brand>为 List<BrandVo>
            List<Brand> records = brandPage.getRecords();
            List<BrandVo> brandVos = BeanConv.toBeanList(records, BrandVo.class);
            //处理附件
            if (!EmptyUtil.isNullOrEmpty(brandVoPage) && !EmptyUtil.isNullOrEmpty(brandVos)){
                  //循环遍历   处理附件
                brandVos.forEach(brandVo1 ->
                        {
                            List<AffixVo> affixVoByBusinessId = affixFace.findAffixVoByBusinessId(brandVo1.getId());
                        if (!EmptyUtil.isNullOrEmpty(affixVoByBusinessId)){
                            brandVo1.setAffixVo(affixVoByBusinessId.get(0));
                        }
                        }
                        );

            }
            //返回结果
            brandVoPage.setRecords(brandVos);
            return brandVoPage;
        } catch (Exception e) {
            log.error("查询品牌列表异常：{}", ExceptionsUtil.getStackTraceAsString(e));
            throw new ProjectException(BrandEnum.PAGE_FAIL);
        }
    }

    @Override
    public BrandVo createBrand(BrandVo brandVo) throws ProjectException{
        try {

            //执行保存
            Brand brand = brandService.createBrand(brandVo);

            // 转换类型
            BrandVo brandVo1 = BeanConv.toBean(brand, BrandVo.class);

            //绑定附件
            brandVo.getAffixVo().setBusinessId(brandVo1.getId());
            AffixVo affixVo = affixFace.bindBusinessId(brandVo.getAffixVo());// 绑定 附件 与 品牌的关系
            brandVo1.setAffixVo(affixVo);
            return brandVo1;
        } catch (Exception e) {
            log.error("保存品牌异常：{}", ExceptionsUtil.getStackTraceAsString(e));
            throw new ProjectException(BrandEnum.CREATE_FAIL);
        }
    }

    @Override
    public Boolean updateBrand(BrandVo brandVo)throws ProjectException {
        try {
            //执行修改
            //修改对应的附件图片（先删除后添加）
                    //删除图片
                    //绑定新图片
            return null;
        } catch (Exception e) {
            log.error("修改品牌列表异常：{}", ExceptionsUtil.getStackTraceAsString(e));
            throw new ProjectException(BrandEnum.UPDATE_FAIL);
        }

    }

    @Override
    public Boolean deleteBrand(String[] checkedIds) throws ProjectException{
        try {
            //执行删除
            //删除图片
            return null ;
        } catch (Exception e) {
            log.error("删除品牌列表异常：{}", ExceptionsUtil.getStackTraceAsString(e));
            throw new ProjectException(BrandEnum.DELETE_FAIL);
        }
    }

    @Override
    public BrandVo findBrandByBrandId(Long brandId)throws ProjectException {
        try {
            return null;
        } catch (Exception e) {
            log.error("查找品牌所有品牌异常：{}", ExceptionsUtil.getStackTraceAsString(e));
            throw new ProjectException(BrandEnum.SELECT_BRAND_FAIL);
        }
    }

    @Override
    public List<BrandVo> findBrandVoList()throws ProjectException {
        try {
       return BeanConv.toBeanList(brandService.findBrandVoList(),BrandVo.class);

        } catch (Exception e) {
            log.error("查询品牌列表异常：{}", ExceptionsUtil.getStackTraceAsString(e));
            throw new ProjectException(BrandEnum.PAGE_FAIL);
        }
    }
}
